package ch01;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class BeanUtil {
    // 创建任意类型的对象方法
    public static Object found(String name) throws Exception {
        // 1.获取 Student 类的 Class 对象
        try {
            Class<?> clazz = Class
                    .forName(name);
            // 在反射中，把类的相关信息封装为相关的对象
            // 2.通过 Class 对象，获取类的构造方法对象
            Constructor<?> constructor = clazz.getConstructor();

            // 3.实例化对象
            return constructor.newInstance();
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }

    // 调用指定的方法
    public static void invoke(String className, String methodName, Class<?>[] paramTypes, Object... args)
            throws Exception {
        try {
            Class<?> clazz = Class
                    .forName(className);
            // 4.通过 Class 对象，获取要调用的方法
            // 语法：getMethod("方法名",方法参数的 Class 对象,...)
            Method method = clazz.getMethod(methodName, paramTypes);
            // 5.调用方法 - 对象.xxx() ;
            // 在 Method 对象中，提供了 invoke 方法，调用 Method 对象指向的方法
            // 语法：[Object obj = ]invoke("对象名称",实参列表,...)
            method.invoke(found(className), args);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }
}
